﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using CPTECH.Repository;
using CPTECH.Business;

namespace CPTECH.Presentation
{
    public partial class frm_filial : frm_default
    {
        int fluxo = 0;
     
        frm_alterarItem alterar = new frm_alterarItem();
        frm_validarInv validar = new frm_validarInv();

        public frm_filial(frm_alterarItem sendAlterar, frm_validarInv sendValidar, int fluxoReceiv)
        {
            InitializeComponent();
            fluxo = fluxoReceiv;
            alterar = sendAlterar;
            validar = sendValidar;            
        }

        //chama método que popula a list box com as filiais.
        private void frm_filial_Load(object sender, EventArgs e)
        {
            showFiliais();
        }

        //método que popula a list com as filiais.
        private void showFiliais()
        {
            lst_filiais.Items.Clear();
            ArrayList resultado = FilialDB.getInstance().selectAllFiliais();

            for (int i = 0; i < resultado.Count; i++)
            {
                lst_filiais.Items.Add(resultado[i].ToString());
            }       
        }

        //quando selecionado uma filial seta seus valores nos textbox.
        private void lst_filiais_SelectedIndexChanged(object sender, EventArgs e)
        {
            string[] filalSeparada = lst_filiais.SelectedItem.ToString().Split('=');
            txt_codFilial.Text = "";
            txt_codFilial.Text = filalSeparada[0].Trim();
            txt_descFilial.Text = "";
            txt_descFilial.Text = filalSeparada[1].Trim();
        }

        //chama método que checa os valores, salva e chama o form seguinte 
        private void mnu_prosseguir_Click(object sender, EventArgs e)
        {
            checkAndSave();
        }

        //checa valores e campos, grava-os e segue para o proximo form(frm_).
        private void checkAndSave()
        {
            //verifica
            if (txt_codFilial.Text == "" || txt_descFilial.Text == "")
            {
                MessageBox.Show("Selecione uma Filial para continuar", "Aviso");
                lst_filiais.Focus();
            }
            //grava e chama form.
            else
            {
                //verifica se quem chamou do form foi para (inventário)
                if (fluxo == 0)
                {
                    FisicoBO.getInstance().codFilial = txt_codFilial.Text;

                    //checa pra ver se  o formulário local foi marcado para ser chamado.
                    if (FisicoBO.getInstance().ckLocal)
                    {
                        frm_local local = new frm_local(null, null, 0);//craia instancia do novo form.
                        local.showForm(this);//exibe o form novo.
                    }

                    //checa pra ver se  o formulário Departamento foi marcado para ser chamado.
                    else if (FisicoBO.getInstance().ckDepartamento)
                    {
                        frm_departamento departamento = new frm_departamento(null, null, 0);//craia instancia do novo form.
                        departamento.showForm(this);//exibe o form novo.
                    }

                    //chama o formulário de Fisico.
                    else
                    {
                        frm_fisico fisico = new frm_fisico();//cria instancia do novo form.
                        fisico.showForm(this);//exibi form novo.
                    }
                }

                //verifica se quem chamou do form foi para (Re-inventário)
                else if (fluxo == 1)
                {
                    validar.sendedValues("filial", txt_codFilial.Text.Trim());
                    this.closeForm();
                }

                //Caso não seja nenhuma das opções acima interpreta como (alteração.)
                else
                { 
                    alterar.sendedValues("filial", txt_codFilial.Text.Trim());
                    this.closeForm();
                }
            }
        
        }

        //volta para o form anterior
        private void mnu_voltar_Click(object sender, EventArgs e)
        {
            FisicoBO.getInstance().ckCcusto = false;
            FisicoBO.getInstance().ckDepartamento = false;
            FisicoBO.getInstance().ckLocal = false;
            FisicoBO.getInstance().ckPlanta = false;

            this.closeForm();//metodo herdado do default.
        }

        //chama método que adiciona uma filial ou salva (de acordo com o texto)
        private void bt_add_Click(object sender, EventArgs e)
        {
            if (bt_add.Text == "Add")
            {
                activeInsert();
            }
            else
            {
                string os = FisicoBO.getInstance().os;
                Int64 codFilial = Int64.Parse(txt_codFilial.Text);
                string descFilial = txt_descFilial.Text.ToUpper();
                string data = DateTime.Now.ToString("yyyy-MM-dd");

                if (FilialDB.getInstance().checkCodFilial(codFilial))
                {
                    MessageBox.Show("Este código de Filial já existe, favor informar um novo!","Filial");
                    txt_codFilial.Text = "";
                    txt_codFilial.Focus();
                }
                else if (verificaCampos())
                {
                    bool resposta = FilialDB.getInstance().insertNewFilial(os, codFilial, descFilial, data, 1);

                    if (resposta == true)
                    {
                        desactiveInsert();
                        MessageBox.Show("Filial inserida com sucesso!", "Filial");
                        txt_codFilial.Text = codFilial.ToString();
                        txt_descFilial.Text = descFilial;
                        showFiliais();
                    }

                    else if(resposta == false)
                    {
                        MessageBox.Show("Não foi possível adicionar a Filial, cheque os valores informados!", "Filial");
                        txt_codFilial.Focus();
                    }
                }
            }
        }

        //cancela operação de cadastro de filial.
        private void bt_cancelar_Click(object sender, EventArgs e)
        {
            desactiveInsert();
        }

        //verifica campos.
        private bool verificaCampos()
        {
            bool campos = false;

            if (txt_codFilial.Text == "")
            {
                MessageBox.Show("Insira um código de Filial para continuar!","Filial");
                txt_codFilial.Focus();
            }

            else if (txt_descFilial.Text == "")
            {
                MessageBox.Show("Insira uma descrição de Filial para continuar!", "Filial");
                txt_descFilial.Focus();
            }
            else 
            {
                campos = true;
            }

            return campos;
        }

        //muda botão de add para salvar e habilita os campos para inserção.
        private void activeInsert()
        {
            lst_filiais.Enabled = false;
            bt_cancelar.Visible = true;
            txt_codFilial.Enabled = true;
            txt_codFilial.Text = "";
            txt_descFilial.Enabled = true;
            txt_descFilial.Text = "";
            txt_codFilial.Focus();
            bt_add.Text = "Salvar";
        }

        //muda opção de salvar para add e desabilita os campos pra inserção.
        private void desactiveInsert()
        {
            lst_filiais.Enabled = true;
            bt_cancelar.Visible = false;
            txt_codFilial.Enabled = false;
            txt_descFilial.Enabled = false;
            lst_filiais.Focus();
            bt_add.Text = "Add";
        }

        //permite apenar inserção de números neste campo.
        private void txt_codFilial_KeyPress(object sender, KeyPressEventArgs e)
        {
          if(!char.IsDigit(e.KeyChar))
            {
                e.Handled = true;
                MessageBox.Show("Somente números são permitidos neste campo!", "Aviso");
                txt_codFilial.Text = "";
                txt_codFilial.Focus();
            }  
        }
    }
}